Lambda + Kinesis Data Streams で Amazon Connect のエージェントの不在着信をEメールに送信してみた
アノテーションのスライマンです。 今回は Amazon Connect のエージェントイベントストリームを活用して、エージェントが不在着信の際に Eメールに送信する仕組みを作っていきたいと思います。 Amazon Connect の CloudWatch メトリクスには MissedCalls というメトリクスがありますが、こちらのメトリクスではどのエージェントが不在着信をしているのか判別することはできません。 そこで、どのエージェントが不在着信をしているのかを把握するためには、別の手段を取る必要がございます。 Amazon Connect ではエージェントのイベントストリームが存在しており、エージェントのアクティビティをほぼリアルタイムでレポートすることができます。 このエージェントのイベントストリームには、エージェントが MISSED (不在の状態)状態のイベントが含まれており、こちらのイベントで不在着信をしているエージェントを把握することができます。
構成図
構成は下記の通りとなります。
Amazon Connect のエージェントのイベントストリームを Kinesis Data Streams (KDS) で処理します。 イベントストリームが KDS で処理されていることをトリガーに Lambda が起動します。 Lambda では MISSED 状態のイベントが含まれているかどうかを判別して、MISSED 状態のイベントが含まれている場合は、SNS Topic より Eメールに通知します。
概要
下記の手順で必要なリソースを作成、設定していきます。
- Kinesis Data Streams の作成
- Amazon Connect の設定(インスタンス、番号取得、問い合わせフローの設定、データストリーミングの有効化)
- SNS Topic の作成
- Lambda 関数の作成
必要なリソースを準備した後、実際に動作を確認していきたいと思います。
実際にやってみた
Kinesis Data Streams の作成
Amazon Kinesis にてデータストリームを作成します。 下記の通り、データストリーム名を任意で記載して、容量はプロビジョンドを選択します。 この設定でデータストリームを作成します。
Amazon Connect の設定(インスタンス、番号取得、問い合わせフローの設定、データストリーミングの有効化)
Amazon Connect のリソース作成について、本記事では、既に作成している前提として、進めていきます。 Amazon Connect 環境の構築については、下記のブログ記事をご参照ください。
利用する問い合わせフローは下記となります。 内容はシンプルで、電話を受けた際に、「お電話いただきまして、ありがとうございます。」のメッセージが再生され、設定したキューへ転送する流れとなります。 利用するキューもデフォルトで用意されている BasicQueue を利用しています。
今回は、データストリーミングによる連携を実施するため、データストリーミングの設定を有効化する必要があります。 マネジメントコンソールの Amazon Connect インスタンスのページへ進み、データストリーミングの項目で、有効化にクリックします。 その後、先程作成したデータストリームをエージェントイベントに設定して、保存します。
SNS Topic の作成
SNS トピックを作成します。 下記の通り、スタンダードタイプで作成していきます。
次に、サブスクリプションを作成します。 今回はメールに送信するため、プロトコルを Eメールと選択して、エンドポイントに送信先 Eメールを記載します。 サブスクリプションを作成後、確認する必要があるので、該当メールにて確認メールが届いているので、「Confirm Subscription」をクリックします。 その後、サブスクリプションのステータスを確認して「確認済み」になっている場合は、設定完了です。
Lambda 関数の作成
Lambda 関数を作成します。 名前を選択して、ランタイムを Python 3.11 と選択します。 それ以外の設定はデフォルトのままで、関数を作成していきます。
Kinesis Data Streams と SNS との連携をするため、Lambda 実行ロールに下記の IAM ポリシーを追記していきます。
- AWSLambdaKinesisExecutionRole →Kinesis用
- 下記のインラインポリシー(例:sns-publish-policy)→SNS用
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": "sns:Publish", "Resource": "*" } ] }
既存のポリシーに加え、上記の2つを追加して、下記のように3つ存在していれば問題ありません。
続いて、Lambda のトリガーを設定していきます。 下記のように、Kinesis を選択して、作成したデータストリームを選択します。 それ以外の設定はデフォルトのままで、作成します。
コードの設定をしていきます。 今回は Python を利用しました。 下記の通りとなります。
import base64 import json import boto3 import os from datetime import datetime from zoneinfo import ZoneInfo def lambda_handler(event, context): client = boto3.client('sns') arn_sns = os.environ['TOPIC_ARN'] for record in event['Records']: # Decode the Kinesis data payload = base64.b64decode(record["kinesis"]["data"]).decode('utf-8') data = json.loads(payload) # Check agent event stream for contact in data['CurrentAgentSnapshot']['Contacts']: if contact['State'] == 'MISSED': state_start_timestamp = contact['StateStartTimestamp'] username = data['CurrentAgentSnapshot']['Configuration']['Username'] # Convert timestamp from UTC to JST timestamp_date = datetime.strptime(state_start_timestamp, "%Y-%m-%dT%H:%M:%S.%fZ") timestamp_utc = timestamp_date.astimezone(ZoneInfo("UTC")) timestamp_jst = timestamp_utc.astimezone(ZoneInfo("Asia/Tokyo")) # Create the message and subject for email message = f"Amazon Connect からのお知らせです。\n状態:MISSED\n発生時間:{timestamp_jst}\nエージェント名:{username}" subject = "不在着信のお知らせ (Amazon Connect)" # Publish the message response = client.publish( TopicArn=arn_sns, Message=message, Subject=subject, )
実施される処理は下記となります。
- Kinesis のデータを Decode する
- エージェントイベントストリーム内に MISSED の State が存在しているかを判別する
- MISSED の State が存在している場合は、下記の処理が行われます。
- タイムスタンプを UTC から JST に変換
- タイムスタンプおよびエージェント名が含まれる不在着信に関する通知を作成する
- 作成した通知をEメールに送信する
MISSED (不在の着信)の情報は State に含まれており、CurrentAgentSnapshot 内の Contacts より取得することができます。 StateStartTimestamp (開始時間)の情報も同じく、CurrentAgentSnapshot 内の Contacts より取得することができます。 Username(エージェント名)の情報は CurrentAgentSnapshot 内の Configuration より取得することができます。 エージェントイベントストリームで取得できるイベントについては、下記のドキュメントをご参照ください。
最後に SNS トピックの環境変数を設定します。
キー:TOPIC_ARN 値:arn:aws:sns:<region>:<accountid>:Connect-lambda
動作確認
Amazon Connect の電話番号に発信して、不在着信を発生させ、動作を確認します。 不在着信が発生した後、ほぼリアルタイムで下記の通知をEメールで確認しましたので、正常に動作していることがわかります。
参考情報
- エージェントイベントストリームのデータモデル
- エージェントイベントストリームの例
- boto3
- AWS TimestreamのtimeカラムをLambdaでJSTに変換する際のTips
- AmazonConnect のオペレータ状態変化などをリアルタイムに取得する方法
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。